package ru.inse.core.service;

import java.util.List;

import ru.inse.core.dao.DaoException;
import ru.inse.core.dao.ICriteriaAppender;
import ru.inse.core.domain.BaseEntity;
import ru.xeden.core.exception.CoreException;


/**
 * Абстрактный класс для менеджеров.
 * Реализует общие для всех методы
 *
 * @param <E> тип сущности
 */
public interface IService<E extends BaseEntity>
{
    /**
     * Сохраняет или обновляет объект
     * @param entity
     * @throws Exception
     */
    void save(E entity) throws CoreException;

    void persist(E entity) throws CoreException;

    /**
     * Возвращает все сущности
     * @return
     */
    List<E> getAll();

    /**
     * Возвращает объект по id
     *
     * @param id
     * @return
     * @throws DaoException выкидывает исключение если сущность по указанному ID не найдена
     */
    E getById(Long id) 
        throws DaoException;

    /**
     * Удаляет сущность из базы по ID
     *
     * @param id
     * @throws DaoException если такой сущности не найдено
     */
    void remove(Long id)
        throws DaoException;

    /**
     * Удаляет все сущности из базы
     */
    void removeAll();

    /**
     * @return количество сущностей в БД
     */
    Long count();
    

    /**
     * @return количество сущностей в БД
     * @throws DaoException 
     */
    Long count(ICriteriaAppender criteriaAppender);

}
